﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FTools.Interface;
using FTools.Comunicacion;
using System.Collections;
using FTools.Dominio;
using FTools.Generico;

namespace FTools.Presentacion
{
    public partial class FrmPedido : Form
    {
        InterfacePedido interfacePedido = new ComPedido();
        InterfaceProducto interfaceProducto = new ComProducto();
        InterfaceSubProducto interfaceSubProducto = new ComSubProducto();
        InterfacePersona interfacePersona = new ComPersona();
        InterfaceSpStock interfaceSpStock = new ComSpStock();

        public FrmPedido()
        {
            InitializeComponent();
        }

        //LOAD
        private void FrmPedido_Load(object sender, EventArgs e)
        {

        }

        //ETIQUETA
        private void labelPedidos_Click(object sender, EventArgs e)
        {
            //FuncionesGenericas.limpiarTextForm(this);
            //FuncionesGenericas.limpiarComboForm(this);
            FuncionesGenericas.limpiarForm(this);
        }

/* ################################################################################################################################ */

#region Botones

        //GRABAR PEDIDO
        private void btnGrabarPedido_Click(object sender, EventArgs e)
        {
            if (this.controlPedido())
            {
                Pedido objPedido = new Pedido();
                foreach (ListViewItem x in lvwPersona.Items)
                {
                    Persona objTag = (Persona)x.Tag;
                    objPedido.ObjPersona = objTag;
                }
                objPedido.Estado = "A";
                objPedido.Fecha = dtpPedidoFecha.Value.ToShortDateString();
                objPedido.Hora = dtpPedidoFecha.Value.ToShortTimeString();
                objPedido.FechaProg = dtpPedidoFechaProg.Value.ToShortDateString();
                objPedido.HoraProg = dtpPedidoFechaProg.Value.ToShortTimeString();
                foreach (ListViewItem xSp in lvwPedidoProducto.Items)
                {
                    SubProducto objSubProducto = (SubProducto)xSp.Tag;
                    PedidoReng objPedidoReng = new PedidoReng();
                    objPedidoReng.ObjSubProducto = objSubProducto;
                    objPedidoReng.Cantidad = Convert.ToInt32(xSp.SubItems[5].Text);
                    objPedido.ColPedidoReng.Add(objPedidoReng);
                }
                interfacePedido.altaPedido(objPedido);
            }
        }

        //ELIMINAR PEDIDO
        private void btnBorrarPedido_Click(object sender, EventArgs e)
        {

        }

        //INGRESO SP A PEDIDO
        private void btnGrabarPedidoSp_Click(object sender, EventArgs e)
        {
            if (cboSubProducto.SelectedIndex >= 0)
            {
                SubProducto objSubProducto = (SubProducto)cboSubProducto.SelectedItem;
                if (!existeLvwPedidoProducto(objSubProducto.IdSubProducto))
                {
                    this.cargarLvwPedidoProducto(objSubProducto, Convert.ToDouble(txtPedidoCant.Text));
                    FuncionesGenericas.limpiarComboForm(this);
                    FuncionesGenericas.limpiarTextForm(this);
                }
                else
                {
                    MessageBox.Show("#Error Interno: El SubProducto ya fue ingresado", "SubProducto", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }

#endregion

/* ################################################################################################################################ */

#region Metodos

        //METODO CONTROL PEDIDO
        public Boolean controlPedido()
        {
            this.errorProvider1.Clear();
            String fecha = FuncionesFecha.formatoFechaAAAAMMDD(dtpPedidoFecha.Value.ToShortDateString());
            String hora = dtpPedidoFecha.Value.ToShortTimeString();
            String fechaProg = FuncionesFecha.formatoFechaAAAAMMDD(dtpPedidoFechaProg.Value.ToShortDateString());
            String horaProg = dtpPedidoFechaProg.Value.ToShortTimeString();
            if (Convert.ToInt32(fecha) >= Convert.ToInt32(FuncionesFecha.fechaSistema()) && Convert.ToInt32(fechaProg) >= Convert.ToInt32(FuncionesFecha.fechaSistema()) && lvwPersona.SelectedItems.Count > 0 &&
                Convert.ToInt32(fechaProg) >= Convert.ToInt32(fecha) && lvwPedidoProducto.Items.Count > 0)
            {
                return true;
            }
            else if (Convert.ToInt32(fechaProg) < Convert.ToInt32(fecha))
            {
                this.errorProvider1.SetError(dtpPedidoFechaProg, "La Fecha de programacion del Pedido no puede ser menor a la Fecha del Pedido");
            }
            else if (Convert.ToInt32(fechaProg) < Convert.ToInt32(FuncionesFecha.fechaSistema()))
            {
                this.errorProvider1.SetError(dtpPedidoFechaProg, "La Fecha de programacion del Pedido no puede ser menor a la actual");
            }
            else if (lvwPersona.SelectedItems.Count == 0)
            {
                this.errorProvider1.SetError(lvwPersona, "Debe seleccionar Persona");
                this.errorProvider1.SetIconAlignment(lvwPersona, ErrorIconAlignment.TopRight);
            }
            else if (lvwPedidoProducto.Items.Count == 0)
            {
                this.errorProvider1.SetError(lvwPedidoProducto, "Debe ingresar al menos un SubProducto para el Pedido");
                this.errorProvider1.SetIconAlignment(lvwPedidoProducto, ErrorIconAlignment.TopRight);
            }
            return false;
        }

        //CARGA CBO PRODUCTOS (Para seleccion en SP)
        public void cargarCboProducto(String xCodigo, String xNombre)
        {
            cboProducto.Items.Clear();
            //try
            //{
            ArrayList colProducto = interfaceProducto.obtenerBusquedaProductoSimult(xCodigo, xNombre);
            foreach (Producto objProducto in colProducto)
            {
                cboProducto.Items.Add(objProducto);
            }
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show("#Presentacion# " + ex.Message);
            //}
        }

        //CARGA CBO SUBPRODUCTOS
        public void cargarCboSubProducto(ArrayList xColSubProdcuto)
        {
            cboSubProducto.Items.Clear();
            if (xColSubProdcuto.Count > 0)
            {
                foreach (SubProducto objSubProducto in xColSubProdcuto)
                {
                    cboSubProducto.Enabled = true;
                    cboSubProducto.Text = "";
                    cboSubProducto.Items.Add(objSubProducto);
                }
            }
            else 
            {
                cboSubProducto.Enabled = false;
                cboSubProducto.Text = "No hay SubProductos para mostrar";
            }
        }

        //CARGAR LVW PERSONAS
        private void cargarLvwPersona(ArrayList colPersonas)
        {
            lvwPersona.Items.Clear();
            lvwPersona.Columns.Clear();
            ListViewItem x;
            lvwPersona.Columns.Add("ID", 80, HorizontalAlignment.Left);
            lvwPersona.Columns.Add("Nombre", 120, HorizontalAlignment.Left);
            lvwPersona.Columns.Add("Tipo", 100, HorizontalAlignment.Left);
            foreach (Persona objPersona in colPersonas)
            {
                String tipo = ""; 
                if (objPersona.Tipo.Equals("F")) { tipo = "Persona Fisica"; }
                else if (objPersona.Tipo.Equals("J")) { tipo = "Persona Juridica"; }
                else if (objPersona.Tipo.Equals("P")) { tipo = "Proveedor"; }

                x = lvwPersona.Items.Add(Convert.ToString(objPersona.IdPersona));
                x.SubItems.Add(objPersona.Nombre);
                x.SubItems.Add(tipo);
                x.Tag = objPersona;
            }
        }

        //CARGAR LVWPEDIDOPRODUCTO (Por Item)
        private void cargarLvwPedidoProducto(SubProducto xObjSubProducto, double xCant)
        {
            ListViewItem x;
            if (xObjSubProducto != null && xCant > 0)
            {
                if (lvwPedidoProducto.Columns.Count == 0)
                {
                    lvwPedidoProducto.Columns.Add("Codigo", 60, HorizontalAlignment.Left);
                    lvwPedidoProducto.Columns.Add("Cod Int", 60, HorizontalAlignment.Left);
                    lvwPedidoProducto.Columns.Add("Cod Prov", 60, HorizontalAlignment.Left);
                    lvwPedidoProducto.Columns.Add("Nombre", 100, HorizontalAlignment.Left);
                    lvwPedidoProducto.Columns.Add("Stock", 40, HorizontalAlignment.Left);
                    lvwPedidoProducto.Columns.Add("Cant", 40, HorizontalAlignment.Left);
                }
                x = lvwPedidoProducto.Items.Add(xObjSubProducto.Codigo);
                x.SubItems.Add(xObjSubProducto.CodigoInterno);
                x.SubItems.Add(xObjSubProducto.CodigoProveedor);
                x.SubItems.Add(xObjSubProducto.Nombre);
                if (interfaceSpStock.existeSpStock(xObjSubProducto.IdSubProducto))
                {
                    SpStock objSpStock = interfaceSpStock.obtenerSpStock(xObjSubProducto.IdSubProducto);
                    x.SubItems.Add(Convert.ToString(objSpStock.Stock));
                }
                else { x.SubItems.Add("Stock N/A"); }
                x.SubItems.Add(Convert.ToString(xCant));
                x.Tag = xObjSubProducto;
            }
        }

        //CARGAR LVWPEDIDOPRODUCTO (Por Coleccion)
        private void cargarLvwPedidoProducto(ArrayList xColPedidoReng)
        {
            lvwPedidoProducto.Items.Clear();
            lvwPedidoProducto.Columns.Clear();
            ListViewItem x;
            if (xColPedidoReng.Count > 0)
            {
                lvwPedidoProducto.Columns.Add("Codigo", 60, HorizontalAlignment.Left);
                lvwPedidoProducto.Columns.Add("Cod Int", 60, HorizontalAlignment.Left);
                lvwPedidoProducto.Columns.Add("Cod Prov", 60, HorizontalAlignment.Left);
                lvwPedidoProducto.Columns.Add("Nombre", 100, HorizontalAlignment.Left);
                lvwPedidoProducto.Columns.Add("Stock", 40, HorizontalAlignment.Left);
                lvwPedidoProducto.Columns.Add("Cant", 40, HorizontalAlignment.Left);
                foreach (PedidoReng objPedidoReng in xColPedidoReng)
                {
                    SubProducto objSubProducto = interfaceSubProducto.obtenerSubProducto(objPedidoReng.ObjSubProducto.IdSubProducto);
                    x = lvwPedidoProducto.Items.Add(objSubProducto.Codigo);
                    x.SubItems.Add(objSubProducto.CodigoInterno);
                    x.SubItems.Add(objSubProducto.CodigoProveedor);
                    x.SubItems.Add(objSubProducto.Nombre);
                    if (interfaceSpStock.existeSpStock(objSubProducto.IdSubProducto))
                    {
                        SpStock objSpStock = interfaceSpStock.obtenerSpStock(objSubProducto.IdSubProducto);
                        x.SubItems.Add(Convert.ToString(objSpStock.Stock));
                    }
                    else { x.SubItems.Add("Stock N/A"); }
                    x.SubItems.Add(Convert.ToString(objPedidoReng.Cantidad));
                    x.Tag = objSubProducto;
                }
            }
        }

        //CHEQUEA EXISTENCIA SUBPRODUCTOS EN LVWPEDIDOPRODUCTO
        private Boolean existeLvwPedidoProducto(long xIdSubProducto)
        {
            foreach (ListViewItem x in lvwPedidoProducto.Items)
            {
                SubProducto objSubProducto = (SubProducto)x.Tag;
                if (objSubProducto.IdSubProducto == xIdSubProducto)
                    return true;
            }
            return false;
        }

        private void limpiarLvwPedidoProducto()
        {
            lvwPedidoProducto.Items.Clear();
            lvwPedidoProducto.Columns.Clear();
        }

        //CARGA COMBO PEDIDO
        public void cargarCboPedido(ArrayList colPedido)
        {
            foreach (Pedido objPedido in colPedido)
            {
                cboPedido.Items.Add(objPedido);
            }
        }


#endregion

/* ################################################################################################################################ */

#region Controles

        //SELECCION CBOPRODUCTO
        private void cboProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboProducto.SelectedIndex >= 0)
            {
                Producto objProducto = (Producto)cboProducto.SelectedItem;
                ArrayList colSubProducto = interfaceSubProducto.obtenerColeccionSubProducto(objProducto.IdProducto);
                this.cargarCboSubProducto(colSubProducto);
            }
        }

        //SELECCION CBOSUBPRODUCTO
        private void cboSubProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboSubProducto.SelectedIndex >= 0)
            {
                SubProducto objSubProducto = (SubProducto)cboSubProducto.SelectedItem;
            }
        }

        //DROPDOWN CBOPRODUCTO
        private void cboProducto_DropDown(object sender, EventArgs e)
        {
            this.cargarCboProducto(cboProducto.Text, cboProducto.Text);
        }

        //DROPDOWN CBOSUBPRODUCTO
        private void cboSubProducto_DropDown(object sender, EventArgs e)
        {
            if (cboProducto.SelectedIndex >= 0)
            {
                Producto objProducto = (Producto)cboProducto.SelectedItem;
                ArrayList colSubProducto = interfaceSubProducto.obtenerBusquedaSubProductoSimult(cboSubProducto.Text, cboSubProducto.Text, cboSubProducto.Text, cboSubProducto.Text, objProducto.IdProducto);
                this.cargarCboSubProducto(colSubProducto);
            }
        }

        //CAMBIO TEXTO TXTPERSONA
        private void txtPersona_TextChanged(object sender, EventArgs e)
        {
            ArrayList colPersona = interfacePersona.obtenerBusquedaPersona(txtPersona.Text);
            this.cargarLvwPersona(colPersona);
        }

        //SELECCION LVWPERSONAS
        private void lvwPersona_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvwPersona.SelectedItems.Count > 0)
            {
                foreach (ListViewItem x in lvwPersona.SelectedItems)
                {
                    if (x.Tag != null)
                    {
                        //Persona objPersona = (Persona)x.Tag;
                        panelProducto.Enabled = true;
                        panelPedidoEstado.Enabled = true;
                        panelPedidoDetalle.Enabled = true;
                        cboEstado.SelectedIndex = -1;
                    }
                }
            }
            else
            {
                panelProducto.Enabled = false;
                panelPedidoEstado.Enabled = false;
                cboPedido.SelectedIndex = -1;
                cboEstado.SelectedIndex = -1;
                panelPedidoDetalle.Enabled = false;
            }
        }

        //SELECCION CBOESTADO
        private void cboEstado_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lvwPersona.SelectedItems.Count > 0 && cboEstado.SelectedIndex >= 0 && cboEstado.Text != "")
            {
                foreach (ListViewItem x in lvwPersona.SelectedItems)
                {
                    Persona objPersona = (Persona)x.Tag;
                    String estado = cboEstado.Text.Substring(0, 1);
                    ArrayList colPedido = interfacePedido.obtenerColeccionPedido(objPersona.IdPersona, estado);
                    cboPedido.Items.Clear();
                    if (colPedido.Count > 0)
                    {
                        panelPedidoDetalle.Enabled = true;
                        this.cargarCboPedido(colPedido);
                    }
                    else
                    {
                        panelPedidoDetalle.Enabled = false;
                        limpiarLvwPedidoProducto();
                    }
                }
            }
        }

        //SELECCION CBOPEDIDO (De un pedido carga los renglones en LvwPedidoProducto)
        private void cboPedido_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboPedido.SelectedIndex >= 0)
            {
                Pedido objPedido = (Pedido)cboPedido.SelectedItem;
                limpiarLvwPedidoProducto();
                this.cargarLvwPedidoProducto(objPedido.ColPedidoReng);
            }
        }
        
#endregion

/* ################################################################################################################################ */

        private void button1_Click(object sender, EventArgs e)
        {
            foreach (ListViewItem xSp in lvwPedidoProducto.Items)
            {
                MessageBox.Show("SubItem=" + xSp.SubItems[5].Text);
            }
        }

    }
}
